import BaseXform from './base-xform';

/* 'virtual' methods used as a form of documentation */
/* eslint-disable class-methods-use-this */

// base class for xforms that are composed of other xforms
// offers some default implementations
class CompositeXform extends BaseXform {
    createNewModel(node) {
        return {};
    }

    parseXmlObject(node) {
        this.parser = this.parser || this.map[node._name];
        if (this.parser) {
            this.parser.parseXmlObject(node);
            return true;
        }

        if (node._name === this.tag) {
            this.model = this.createNewModel(node);
            return true;
        }
        return false;
    }

    parseOpen(node) {
        // Typical pattern for composite xform
        this.parser = this.parser || this.map[node.name];
        if (this.parser) {
            this.parser.parseOpen(node);
            return true;
        }

        if (node.name === this.tag) {
            this.model = this.createNewModel(node);
            return true;
        }

        return false;
    }

    parseText(text) {
        // Default implementation. Send text to child parser
        if (this.parser) {
            this.parser.parseText(text);
        }
    }

    onParserClose(name, parser) {
        // parseClose has seen a child parser close
        // now need to incorporate into this.model somehow
        this.model[name] = parser.model;
    }

    parseClose(name) {
        // Default implementation
        if (this.parser) {
            if (!this.parser.parseClose(name)) {
                this.onParserClose(name, this.parser);
                this.parser = undefined;
            }
            return true;
        }

        return name !== this.tag;
    }
}

export default CompositeXform;
